#include <iostream>
#include <string>
#include <unistd.h>
#include <pthread.h>
#include "RingQueue.hpp"
using std::cin;
using std::cout;
using std::endl;
<<<<<<< HEAD
int gcap = 0;
int data = 1;
void *producer(void *args)
{
    // static_cast是C++11引入的强制类型转换
    RingQueue<int> *rq = static_cast<RingQueue<int> *>(args);
    while (1)
    {
        // 1.生产者获得任务
        cout << "生产者生产了一个任务： " << data << endl;
        // 2.生产者生成任务
        rq->Enqueue(data);
        data++;
    }
}
void *consumer(void *args)
{
    RingQueue<int> *rq = static_cast<RingQueue<int> *>(args);
    while (1)
    {
        // 1.消费者消费任务
        int t = 0;
        rq->Pop(&t);
        // 2.处理任务
        cout << "消费者处理了一个任务： " << t << endl;
    }
}
int main()
{
    // 申请环形队列
    //cout << "请输入环形队列的大小" << endl;
    //cin >> gcap;
    RingQueue<int> *rq = new RingQueue<int>();
    // 构造多生产者多消费者
=======
struct threaddata
{
    RingQueue<int> *rq;
    std::string name;
};
int data = 1;
void *producer(void *args)
{
    // static_cast是C++11引入的强制类型转换
    threaddata *td = static_cast<threaddata *>(args);
    while (1)
    {
        sleep(1);
        // 1.生产者获得任务
        cout << td->name << " 生产了一个任务： " << data << endl;
        // 2.生产者生成任务
        td->rq->Enqueue(data);
        data++;
    }
}
void *consumer(void *args)
{
    threaddata *td = static_cast<threaddata *>(args);
    while (1)
    {
        sleep(2);
        // 1.消费者消费任务
        int t = 0;
        td->rq->Pop(&t);
        // 2.处理任务
        cout << td->name << " 处理了一个任务： " << t << endl;
    }
}
int gcap = 0;
int main()
{
    // 申请环形队列
    cout << "请输入环形队列的大小" << endl;
    cin >> gcap;
    RingQueue<int> *rq = new RingQueue<int>();
    // 先统一创建多生产者多消费者
>>>>>>> 5b09c08c250e9d9f594a71640feff181ec4a6f13
    // 多生产者
    cout << "请输入生产者的个数" << endl;
    int m = 0;
    cin >> m;
    std::vector<pthread_t> pro(m);
    for (int i = 0; i < m; i++)
    {
<<<<<<< HEAD
        pthread_create(&pro[i], nullptr, producer, rq);
    }
    for(int i=0;i<m;i++)
    {
        pthread_join(pro[i], nullptr);
=======
        threaddata *td = new threaddata();
        std::string name = "生产者-";
        name += ('0' + i + 1);
        td->name = name;
        td->rq = rq;
        pthread_create(&pro[i], nullptr, producer, td);
>>>>>>> 5b09c08c250e9d9f594a71640feff181ec4a6f13
    }
    // 多消费者
    cout << "请输入消费者的个数" << endl;
    int n = 0;
    cin >> n;
    std::vector<pthread_t> con(n);
    for (int i = 0; i < n; i++)
    {
<<<<<<< HEAD
        pthread_create(&con[i], nullptr, consumer, rq);
    }
    for(int i=0;i<n;i++)
    {
        pthread_join(con[i], nullptr);
    }
=======
        threaddata *td = new threaddata();
        std::string name = "消费者-";
        name += ('0' + i + 1);
        td->name = name;
        td->rq = rq;
        pthread_create(&con[i], nullptr, consumer, td);
    }
    // 统一进行等待
    for (auto &t : pro)
        pthread_join(t, nullptr);
    for (auto &t : con)
        pthread_join(t, nullptr);
>>>>>>> 5b09c08c250e9d9f594a71640feff181ec4a6f13
    return 0;
}
